/**
* @class
*    jsTooltips Class 특정 element's 에 마우스를 오버 하였을 경우 특정 마우스 밑에 레이어가 출력
*
*   옵션 및 인스턴스가 공유 될 것인지 , 각각 해당되는 지역으로 만 존재 할 지 고민하고 개발해야 한다.
*
* @options
        'delay' : 200, // 사라지는 시간.
        'id'    : "jsTooltip" ,
        'top'   : 5, 사우스에서의 위치
        'left'  : 5,
        'fade'  : false,
        'opacity' :1,
        'track' : true ,
        'isLayer': false
*
* @example
*
* @html
* <div title=' good! ' class='jsTip' ></div>
*
* @run
* $.jsTip(".mytips",opts); or $('.jsTip').jsTip(opts);
*
* @name jsToopl
* @author JsYang <yakuyaku@gmail.com>
* @since 2010-03-11
* @version 1.0
*
*/

;(function($){

    $.fn.Tooltip = function(options) {
    return $.Tooltip(this, options);
    };

    $.fn.Tooltip.defaults = {
    'name' : 'jsTooltip' ,
    'top'  : '5',
    'left' : '5',
    'fade' : true ,
    'opacity'  : '0.8',
    'track'    : true ,
    'useLayer' : false ,
    'tiplayer' : "tiplayer" ,
    'findPattern' : "tiplayer",
    'delay'    : '1000'
    };

    $.Tooltip = function(els, opts) {
    var tipText = "";
    var op = $.extend({}, $.fn.Tooltip.defaults , opts);
    var $els      = $(els);
    var $tipLayer = null;
    var hideTimer = null;

    //tips 레이어 생성, 툴팁이 있을경우 기존 없을 경우 새로 생성
    if(!$("#" + op.name).get(0)) $tipLayer = $.Tooltip.createTipLayer(op.name);
    else $tipLayer = $("#" + op.name);

    var tips = {
    'save' : function(evt){
    if(op.useLayer) {
    var re = new RegExp(op.findPattern+"$","g");
    if(re.test(this.tooltipText)) {
    var layer = this.tooltipText.replace(op.findPattern,"");
    this.tooltipText = $("#" + layer).html();
    };
    }
    $tipLayer.find(".tipContents").html(this.tooltipText);
    tips.show(evt);
    },
    'hide' : function(){
    tips.remove();
    if(op.fade) {
    if ($tipLayer.is(":animated")) {
    $tipLayer.stop().fadeTo(op.fade, 0);
    } else {
    $tipLayer.stop().fadeOut(op.fade);
    }
    } else {
    hideTimer = setTimeout(function() {
       $tipLayer.hide();
    }, op.delay);
    }
    },
    'show' : function(evt){
    tips.remove();
    if(op.fade) {
    if ($tipLayer.is(":animated")) {
    $tipLayer.stop().show().fadeTo(op.fade, op.opacity);
    } else {
    $tipLayer.is(':visible') ? $tipLayer.fadeTo(op.fade, op.opacity) : $tipLayer.fadeIn(op.fade);
    }
    } else $tipLayer.show();

        $(document.body).bind('mousemove', tips.setPosition);
    tips.setPosition(evt);
    },
    'remove' : function(){
    if(hideTimer) clearTimeout(hideTimer);
    },
    'setPosition' : function(event) {

    if(!op.track && $tipLayer.is(":visible")){
    $(document.body).unbind('mousemove', tips.setPosition);
    }

    var cPos  = $tipLayer.offset();
    var cLeft = cPos.left;
    var cTop  = cPos.top;
    var v = tips.winPosition();
    var h = $tipLayer.get(0);

    if(event) {
    cLeft = event.pageX + parseInt(op.left);
    cTop  = event.pageY + parseInt(op.top);
    var cRight='auto';
    $tipLayer.css({
    left: cLeft,
    right: cRight,
    top: cTop
    });
    }

    // 윈도우 가로 창 사이즈 보다 클때
    if (v.x + v.cx < h.offsetLeft + h.offsetWidth) {
    cLeft -= h.offsetWidth + 5 + parseInt(op.left);
    $tipLayer.css({left: cLeft + 'px'});
    }

    // 윈도우 세로 창 사이즈 보다 클때
    if (v.y + v.cy < h.offsetTop + h.offsetHeight) {
       cTop -= h.offsetHeight + 5 + parseInt(op.top);
       $tipLayer.css({top: cTop + 'px'});
    }
    },
    'winPosition' : function()
    {
                return {
                    x:  $(window).scrollLeft(),
                    y:  $(window).scrollTop(),
                    cx: $(window).width(),
                    cy: $(window).height()
                };
    }
    };

        return $els.each(function(){
            this.tooltipText = this.title;
            $(this).removeAttr("title");
        }).hover(tips.save,tips.hide).click(tips.hide);

    };

    $.Tooltip.createTipLayer = function(name) {
    var $tips = $('<div id="'+ name +'"><div class="tipContents"></div></div>');
    $tips.css({position:'absolute', top : '0px', left:'0px', zIndex: '1000' });
    $('body').append($tips);
    return $tips;
    };


})(jQuery);